
package com.x52im.rbchat.logic.chat_friend.vv;

import android.media.MediaPlayer;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import com.eva.android.NewAsyncTask;
import com.eva.android.widget.DataLoadableActivity;
import com.eva.android.DelayedHandler;
import com.eva.android.widget.WidgetUtils;
import com.eva.android.widget.WidgetUtils.ToastType;
import com.eva.android.x.XToolKits;
import com.eva.framework.dto.DataFromServer;
import com.x52im.rbchat.Const;
import com.x52im.rbchat.MyApplication;
import com.x52im.rbchat.R;
import com.x52im.rbchat.cache.ImageCacheLoader;
import com.x52im.rainbowchat.http.logic.dto.RosterElementEntity;
import com.x52im.rbchat.logic.chat_friend.utils.MessageHelper;
import com.x52im.rbchat.logic.chat_root.model.VoipRecordMeta;
import com.x52im.rbchat.logic.qrcode.utils.StatusBarUtils;
import com.x52im.rbchat.utils.PromtHelper;
import com.x52im.rbchat.network.im.ChatMessageEventListener;
import com.x52im.rbchat.permission2.PermissionManager;
import com.x52im.rbchat.utils.IntentFactory;

import java.text.MessageFormat;
import java.util.List;
import java.util.Observer;

/**
 * 音视频聊天请求呼出处理Activity.
 * 
 * @author Jack Jiang(http://www.52im.net/space-uid-1.html)
 * @version 1.0
 */
public class VideoCallComeActivity extends DataLoadableActivity {
	private final static String TAG = VideoCallComeActivity.class.getSimpleName();
	
	/** 文本组件：好友昵称 */
	private TextView viewFriendNickName = null;
	/** 文本组件：提示文本 */
	private TextView viewHint = null;
	/** 按钮：接受 */
	private View btnAccept = null;
	/** 按钮：拒绝 */
	private View btnReject = null;
	/** 好友头像 */
	private ImageView viewAvatar = null;
	
	private MediaPlayer promtMp = null;
	
	// 暂存从Intent中传过来的好友信息数据（将要用于界面展现）:
	private String friendUIDForInit = null; 
	
	/** 
	 * 音视频聊天呼入事件观察者（本观察者将在{@link ChatMessageEventListener}收到对
	 * 方（视频聊天接收方）的“取消视频聊天请求”的处理时被通知）.
	 */
	private Observer videoCallComeObserver = (observable, data) -> {
		showHint($$(R.string.video_call_come_cancle_ask), false);
		finishNotSendReject();
	};
	
	// 超时处理Handler
	private DelayedHandler delayedHandler = new DelayedHandler(VoiceCallOutDialog.DEFAULT_CALLING_TIMEOUT){
		@Override
		protected void fireRun() {
			WidgetUtils.showToastLong(self(), $$(R.string.video_call_come_ask_time_out), ToastType.WARN);
			finishNotSendReject();
		}
	};

	/**
	 * Called when the activity is first created.
	 */
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		// 全面屏沉浸式效果（系统顶部状态栏将变的透明，界面从状态栏下方透过）
		XToolKits.setStatusBarTranslucent(this, true);
		// 全面屏沉浸式效果（系统底部导航栏将变的透明，界面从导航栏下方透过）
		XToolKits.setNavigationBarTranslucent(this, true);
		super.onCreate(savedInstanceState);
	}
	
	protected void onResume() {
		super.onResume();
		imc().getTransDataListener().setVideoCallComeObserver(videoCallComeObserver);
	}

	protected void onPause() {
		super.onPause();
		imc().getTransDataListener().setVideoCallComeObserver(null);
	}

	/**
	 * 重写父类方法，取消深色状态栏文字的设置。
	 */
	@Override
	protected void configStatusBarTextColorDark()
	{
		// 什么也不需要做
	}
	
	public void finishNotSendReject() {
		_finish(true);
		super.finish();
	}
	
	@Override 
	public void finish() {
		_finish(false);
		super.finish();
	}
	
	public void _finish(boolean finishNotSendReject) {
		if(delayedHandler != null) {
			delayedHandler.stop();
			delayedHandler = null;
		}

        try {
            if(promtMp != null)
                promtMp.stop();
        } catch (Exception e) {
            Log.w(TAG, e);
        }
		
		if(!finishNotSendReject)
			fireReject();
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected void initDataFromIntent() {
		// 解析从intent中传过来的数据：
		friendUIDForInit = IntentFactory.parseVideoCallComeIntent(getIntent());
	}
	
	/**
	 * 本方法由父类的onCreate()调用，子类可在此方法中实现自已的UI显示逻辑。
	 */
	@Override
	protected void initViews(Bundle savedInstanceState) {
		//养成良好习惯：首先设置主layout，确保后绪的操作中使用到的组件都可以被find到
		setContentView(R.layout.video_call_come_activity_v9);
//		// 对界面上方进行全面屏设置
//		StatusBarUtils.immersiveStatusBar(this, findViewById(R.id.toolbar),0.2f);
		
		this.setTitle($$(R.string.video_call_come_asking));
		
		//** 
		viewFriendNickName = findViewById(R.id.video_call_come_friendNickNameView);
		viewHint = findViewById(R.id.video_call_come_hintView);
		btnAccept = findViewById(R.id.video_call_come_acceptBtn);
		btnReject = findViewById(R.id.video_call_come_rejectBtn);
		viewAvatar = this.findViewById(R.id.voipcall_avatarView);

		//** 对方的好友信息
		RosterElementEntity friendInfo = imc().getFriendsListProvider().getFriendInfoByUid2(friendUIDForInit);
		// ** 显示头像和昵称
		if(friendInfo != null) {
			ImageCacheLoader.loadAvatarImgWithGlide(this, friendInfo.getUser_uid(), friendInfo.getUserAvatarFileName()
					, viewAvatar, 60, R.drawable.default_avatar_yuan_50_3x, true, false);
			viewFriendNickName.setText(friendInfo.getNickname());
		}
		
		//** 提示信息
		showHint($$(R.string.video_call_come_invite_to), false);
		promtMp = PromtHelper.callingPromt(this, friendUIDForInit);

		this.setLoadDataOnCreate(false);

		// 收到视频聊天后，首先进行相关权限的检查，并决定是否继续
		permissionCheck();
	}
	
	public void showHint(String text, boolean needAudioPrompt) {
		if(needAudioPrompt)
			// 播放提示音
			PromtHelper.playendPromt(self());
		viewHint.setText(text);
	}
	
	private void fireReject() {
		// 新聊天框架中的网络数据发送需要放到异步线程里（Android2.3以上版本要求网络交互不允许发生在主线程里）
		new NewAsyncTask<Object, Integer, Integer>(){
			@Override
			protected Integer doInBackground(Object... params) {
				RosterElementEntity friendERR = imc().getFriendsListProvider().getFriendInfoByUid2(friendUIDForInit);
				int code = MessageHelper.sendVideoAndVoiceRequest$Reject_to$a(self(), friendERR.getUser_uid(), imc().getLocalUserInfo().getUser_uid());
				return code;
			}

			@Override
			protected void onPostExecute(Integer code) {
				if(code == 0) {
					showHint($$(R.string.video_call_come_refuse_invite), false);

					// 发出一条音视频聊天记录（这样的话，本地和远端都会有记录的哟）
					MessageHelper.sendVoipRecordMessageAsync(
							// context用全局Application对象，确保消息的发送不依赖于本Activity的生命周期
							MyApplication.getInstance2()
							, friendUIDForInit
							, new VoipRecordMeta(VoipRecordMeta.VOIP_TYPE_VIDEO, VoipRecordMeta.RECORD_TYPE_REQUEST_REJECT)
							, null);
				} else {
					showHint($$(R.string.video_call_come_send_refuse_failure), false);
				}
			}
		}.execute();
	}
	
	/**
	 * 本方法由父类的onCreate()调用，子类可在此方法中为各UI功能组件增加事件临听。
	 */
	@Override
	protected void initListeners() {
		btnAccept.setOnClickListener(v -> {
			if(Const.NO_REAL_TIME_VOICE$VEDIO_SERVICE) {
				WidgetUtils.showToastLong(self(), "因测试条件有限，目前实时音视频服务尚未部署，与此相关的功能可能无法正确响应，请原谅！", ToastType.WARN);
				return;
			}

			// 新聊天框架中的网络数据发送需要放到异步线程里（Android2.3以上版本要求网络交互不允许发生在主线程里）
			new NewAsyncTask<Object, Integer, Integer>(){
				@Override
				protected void onPreExecute() {
					try {
						if(promtMp != null)
							promtMp.stop();
					} catch (Exception e) {
						Log.w(TAG, e);
					}
				}

				@Override
				protected Integer doInBackground(Object... params) {
					RosterElementEntity friendERR = imc().getFriendsListProvider().getFriendInfoByUid2(friendUIDForInit);

					VVP2PProvider.startAVChat(self(), 2, Long.parseLong(friendUIDForInit), friendERR.getNickname());

					//** 2013-12-31日后【实时视频】“同意”指令的发出和接收方案2之【第1/2步：什么也不作，同意指令已经在startAVChat方法中requestAction了】
					int code = 0;

					//** 2013-12-31日前【实时视频】“同意”指令的发出和接收方案1之【第1/2步：发送同意指令】
//						int code = MessageHelper.sendVideoAndVoiceRequest$Accept_to$a(VideoCallComeActivity.this
//								, friendERR.getUser_id()
//								, MyApplication.getInstance(VideoCallComeActivity.this).getLocalUserInfoProvider().getUser_uid()
//								, false, -1);
					return code;
				}

				@Override
				protected void onPostExecute(Integer code) {
					if(code == 0) {
						showHint($$(R.string.video_call_come_received), false);
					} else {
						showHint($$(R.string.video_call_come_receive_failure), false);
					}

					finishNotSendReject();
				}
			}.execute();
		});
		btnReject.setOnClickListener(v -> finish());
	}
	
	@Override
	protected DataFromServer queryData(String... arg0) {
		return null;
	}

	@Override
	protected void refreshToView(Object arg0) {
	}

	/**
	 * 收到视频聊天后，首先进行相关权限的检查，并决定是否继续。
	 *
	 * 说明：动态权限申请用于targetSDKVersion>=23，即Android6.0及以上系统时。
	 */
	private void permissionCheck() {
		Observer obsOnDenied = (o, permissionNamesObj) -> {
			final List<String> permissionNames = (List<String>)permissionNamesObj;
			String message = MessageFormat.format($$(R.string.rb_permission_fail_to_cancel), permissionNames);
			Log.w(TAG, "[动态权限onDenied]"+message);
			WidgetUtils.showToastLong(self(), message, ToastType.WARN);

			// 如果用户拒绝了权限申请，则关闭当前界面（并发出拒绝处理结果）
			btnReject.performClick();
		};

		// 开始动态权限申请（用于targetSDKVersion>=23，即Android6.0及以上系统时）
		PermissionManager.requestPermission_CAMERA_$_RECORD_AUDIO(self()
				//** 权限正常获取，什么也不需要做，等用户自已决定
				, (o, arg) -> {}, obsOnDenied);
	}
}